linux下怎么使用C语言编写接收和发送udp组播数据? 您所在的位置:网站首页 linux 组播收不到 linux下怎么使用C语言编写接收和发送udp组播数据?

linux下怎么使用C语言编写接收和发送udp组播数据?

2024-01-31 05:31| 来源: 网络整理| 查看: 265

一,发送端

代码如下:

先调用initUdpMultiCastSender初始化,

 

int initUdpMultiCastSender(uint32_t localip,uint16_t localport) { int sockfd = socket(AF_INET,SOCK_DGRAM,0); if (-1 == sockfd) { printf("[initUdpMultiCastSender]socket fail\n"); return -1; } struct sockaddr_in myaddr; memset(&myaddr,0,sizeof(myaddr)); myaddr.sin_family = AF_INET; myaddr.sin_port = htons(localport); myaddr.sin_addr.s_addr = localip; int bindret = bind(sockfd,(struct sockaddr *)(&myaddr),sizeof(struct sockaddr)); if (-1 == bindret) { perror("[initUdpMultiCastSender]bind fail\n"); close(sockfd); return -1; } return sockfd; }

后使用sendUdpMultiCast发送数据,

 

int sendUdpMultiCast(int sockfd,char *pMultiCastIp,uint16_t multicastPort,void *data,uint32_t len) { struct sockaddr_in destAddr; destAddr.sin_family = AF_INET; destAddr.sin_addr.s_addr = inet_addr(pMultiCastIp); destAddr.sin_port = htons(multicastPort); int sendLen = sendto(sockfd,data,len,0,(struct sockaddr *)(&destAddr),sizeof(struct sockaddr)); return sendLen; }

 

发送端的代码,整体的思路就是创建socket->绑定本地ip,port(注意,该port不是组播port,而是本地port,指定个未使用的即可)->发送数据(注意,发送的ip和port为组播ip,port)

 

 

二、接收端

 

 

int sockfd = socket(AF_INET,SOCK_DGRAM,0); if (-1 == sockfd) { perror("socket fail\n"); return -3; } printf("socket succ\n"); struct ip_mreq mreq; memset(&mreq,0,sizeof(struct ip_mreq)); mreq.imr_interface.s_addr = htonl(INADDR_ANY); mreq.imr_multiaddr.s_addr = inet_addr(pUdpMultiCastIp); int setoptret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)); if (-1 == setoptret) { perror("setsockopt fail\n"); return -4; } printf("setsockopt ip_add_membership succ\n"); struct sockaddr_in peeraddr; memset(&peeraddr,0,sizeof(struct sockaddr_in)); peeraddr.sin_family = AF_INET; peeraddr.sin_addr.s_addr = inet_addr(pUdpMultiCastIp); peeraddr.sin_port = htons(udpMultiCastPort); int bindRet = bind(sockfd,(struct sockaddr *)(&peeraddr),sizeof(struct sockaddr)); if (-1 == bindRet) { perror("bind fail\n"); return -5; } printf("bind succ\n"); while(1) { char buffer[1024] = {0}; socklen_t addrLen = sizeof(struct sockaddr); printf("ready 2 recv\n"); int recvRet = recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)(&peeraddr),&addrLen); if (-1 == recvRet) { perror("recvfrom fail\n"); break; } printf("recvfrom succ,buffer is %s\n",buffer); }

接收端的代码,整体的思路就是创建socket->加入组播(本地地址和组播地址赋值给mreq)->绑定ip,port(注意,该ip和port是组播ip和组播port)->接收数据(注意,接收的ip和port为组播ip,port)

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有